package com.malou.client.seguridad.usuario;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.binding.FieldBinding;
import com.extjs.gxt.ui.client.binding.FormBinding;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.Validator;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.core.client.GWT;
import com.malou.client.MalouConstants;
import com.malou.client.util.ComboboxFieldBinding;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.tienda.Tiendas;

public class UsuarioDialog extends Dialog {

	private HiddenField<String> id;
	public HiddenField<String> parent_id;
	private TextField<String> usuario;
	private TextField<String> nombres;
	private TextField<String> apellidos;
	private TextField<String> clave;
	private TextField<String> reclave;
	private Button cancelar;
	private Button guardar;	
	public Status status;
	public UsuarioPanel usuarioPanel;
	private FormBinding formBindings;
	Usuario user;
	private ComboBox<BeanModel> tienda;
	private ComboBox<BeanModel> privilegio;
	private  FormPanel panel ;
	
	private MalouConstants constants = GWT.create(MalouConstants.class);
	public UsuarioDialog(){
		super();
		setModal(true);
		setSize(380, 270);
		setButtonAlign(HorizontalAlignment.LEFT);
		setButtons("");
	    
	    panel = new FormPanel();		
		panel.setBorders(false);
	    panel.setBodyBorder(false);
	    panel.setPadding(5);
	    panel.setHeaderVisible(false);
	    panel.setLabelWidth(110);
	    panel.setLayout(new FormLayout());
	    
	    formBindings = new FormBinding(panel, false);	    
	    addFields();
	 	    
	    setFocusWidget(usuario);
	    Component com[]={usuario,clave,reclave,nombres,apellidos,tienda,privilegio,guardar};
		Utilities.Enter(com);
	}
	protected void createButtons() {
	    super.createButtons();
	    
	    if (constants == null) {
	    	constants = GWT.create(MalouConstants.class);
		}
	    
	    status = new Status();
	    status.setBusy(constants.guardando());
	    status.hide();
	    status.setAutoWidth(true);
	    getButtonBar().add(status);
	    
	    getButtonBar().add(new FillToolItem());
	    
	    cancelar = new Button(constants.cancelar(),
				IconHelper.createPath("images/icons/cancel.png"));
		cancelar.setSize(70, 25);
	    cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  UsuarioDialog.this.hide();
	    	  Usuarios.store.rejectChanges();
	      }

	    });

	    guardar = new Button(constants.guardar(),
				IconHelper.createPath("images/icons/save_all.png"));
		guardar.setSize(70, 25);
	    
	    guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {	    	  
	    	  if(validate()){
	    		status.show();
	  		    getButtonBar().disable();
	  		    
	  			user = new Usuario();
	  			if(id.getValue() != null)
	  				user.setId(Integer.valueOf(id.getValue()));
	  			if(parent_id.getValue() != null)
	  				user.setParent_id(Integer.valueOf(parent_id.getValue()));
	  			user.setUsuario(usuario.getValue());
	  			user.setClave(clave.getValue());
	  			user.setNombres(nombres.getValue());
	  			user.setApellidos(apellidos.getValue());
	  			if(tienda.getValue().get("id") != null)
	  				user.setIdtienda(Integer.valueOf(tienda.getValue().get("id").toString()));
	  			if(privilegio.getValue().get("id") != null)
	  				user.setIdprivilegio(Integer.valueOf(privilegio.getValue().get("id").toString()));
	  			
	  			Usuarios.usuarioDialog = UsuarioDialog.this;
	  			Usuarios.saveUser(user);
	    	  }	    	  
	      }
	    });
	    
	    addButton(guardar);
	    addButton(cancelar);	    
	    
	}
	private void addFields() {

		id = new HiddenField<String>();
		id.setVisible(false);
		panel.add(id);
		
		parent_id = new HiddenField<String>();
		parent_id.setVisible(false);
		panel.add(parent_id);
				
		usuario = new TextField<String>();
		usuario.setMinLength(3);
		usuario.setFieldLabel(constants.usuarioUsuario());	    
		usuario.setAllowBlank(false);	    
		panel.add(usuario, new FormData("-20"));
		
		clave = new TextField<String>();
		clave.setMinLength(3);
		clave.setPassword(true);
		clave.setFieldLabel(constants.usuarioClave());	    
		clave.setAllowBlank(false);	    
		panel.add(clave, new FormData("-20"));
		
		reclave = new TextField<String>();
		reclave.setMinLength(3);
		reclave.setPassword(true);
		reclave.setFieldLabel(constants.usuarioReclave());	    
		reclave.setAllowBlank(false);
		reclave.setValidator(new Validator() {			
			@Override
			public String validate(Field<?> field, String value) {
				if(!value.equals(clave.getValue()))
					return constants.usuarioValidarReclave();
				return null;
			}
		});
		panel.add(reclave, new FormData("-20"));
		
		nombres = new TextField<String>();
		nombres.setMinLength(3);
		nombres.setFieldLabel(constants.usuarioNombres());	    
		nombres.setAllowBlank(false);	    
		panel.add(nombres, new FormData("-20"));
		
		apellidos = new TextField<String>();
		apellidos.setMinLength(3);
		apellidos.setFieldLabel(constants.usuarioApellidos());	    
		apellidos.setAllowBlank(false);	    
		panel.add(apellidos, new FormData("-20"));
		
		Tiendas.getComboTienda();
		Tiendas.loaderCombo.load();
		tienda = new ComboBox<BeanModel>();  
		tienda.setEditable(false);
		tienda.setFieldLabel("Tienda");
		tienda.setDisplayField("nombre");
		tienda.setEmptyText("Seleccione...");
		tienda.setWidth(150);  
		tienda.setStore(Tiendas.storeCombo);  
		tienda.setTypeAhead(true);  
		tienda.setTriggerAction(TriggerAction.ALL);
		tienda.setValueField("nombre");
		tienda.setAllowBlank(false);
		tienda.setUseQueryCache(false);
	    panel.add(tienda, new FormData("-20"));
	    
	    Usuarios.getComboPrivilegios();
	    Usuarios.loaderPrivilegio.load();
		
		privilegio = new ComboBox<BeanModel>();  
		privilegio.setEditable(false);
		privilegio.setFieldLabel("Privilegio");
		privilegio.setDisplayField("descripcion");
		privilegio.setEmptyText("Seleccione...");
		privilegio.setWidth(150);  
		privilegio.setStore(Usuarios.storePrivilegio);  
		privilegio.setTypeAhead(true);  
		privilegio.setTriggerAction(TriggerAction.ALL);
		privilegio.setValueField("descripcion");
		privilegio.setAllowBlank(false);
	    panel.add(privilegio, new FormData("-20"));
	    
	 add(panel);
	}
	public void beforeAdd(){
		setIconStyle("user");
		setHeading(constants.usuarioNuevoUsuario());
		clave.setEnabled(true);
		reclave.setEnabled(true);
		usuario.setEnabled(true);
		nombres.setEnabled(true);
		apellidos.setEnabled(true);
	}
	
	public void beforeEdit(){
		setIconStyle("icon-update");
		setHeading(constants.usuarioModificarUsuario());		
		status.hide();
		getButtonBar().enable();
		clave.reset();
		clave.setEnabled(false);		
		reclave.reset();
		reclave.setEnabled(false);
		usuario.setEnabled(true);
		nombres.setEnabled(true);
		apellidos.setEnabled(true);
	}
	
	public void beforeChangePassword(){
		setIconStyle("icon-password");
		setHeading(constants.usuarioCambiarClave());		
		status.hide();
		getButtonBar().enable();
		clave.setEnabled(true);
		clave.clear();
		reclave.setEnabled(true);
		reclave.clear();
		setFocusWidget(clave);
		usuario.setEnabled(false);
		nombres.setEnabled(false);
		apellidos.setEnabled(false);
	}
	
	public void reset(){		  		  
		id.clear();
		usuario.clear();		
		parent_id.clear();
		clave.clear();		
		reclave.clear();		
		nombres.clear();
		apellidos.clear();
		status.hide();
		getButtonBar().enable();
	}
	
	public void setStore(TreeStore<Usuario> store){
		  
		formBindings.addFieldBinding(new FieldBinding(id, "id"));
		formBindings.addFieldBinding(new FieldBinding(parent_id, "parent_id"));
		formBindings.addFieldBinding(new FieldBinding(usuario, "usuario"));		
		formBindings.addFieldBinding(new FieldBinding(nombres, "nombres"));
		formBindings.addFieldBinding(new FieldBinding(apellidos, "apellidos"));
		formBindings.addFieldBinding(new ComboboxFieldBinding(tienda, "tienda"));
		formBindings.addFieldBinding(new ComboboxFieldBinding(privilegio, "privilegio"));
		
		formBindings.setStore(store);
	}
	
	protected boolean validate() {
		boolean gr = usuario.isValid();
		boolean cv = clave.isValid();
		boolean rc = reclave.isValid();
		boolean nm = nombres.isValid();
		boolean ap = apellidos.isValid();
		boolean ti = tienda.isValid();
		boolean pr = privilegio.isValid();
		return gr && cv && rc && nm && ap && ti && pr;
	}
	
	public void bind(Usuario selectedModel){		  
		formBindings.bind(selectedModel);
	}
	public void unbind(){
		formBindings.unbind();
	}
}
